home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 12: Textmags & Docs / nf_archive_12.iso / MAGS / SOURCES / ATARI_SRC.ZIP / atari source / DSHJ2 / FASTROT.S < prev    next >
Encoding:
Text File  |  2001-02-10  |  12.5 KB  |  712 lines

  1. *
  2. *
  3. *   Rotate 90 degrees clockwise a large rectangular page-size form in place
  4. *   where the DST form width is less than the SRC form
  5. *
  6. *   Programmer: Dave Staugas
  7. *         Date: 9-June-89
  8. *
  9. *
  10. *   Paper size data:                    Timings (secs):
  11. *                    Temp buf size:   5k  10k  20k  40k
  12. *     Port_width   Land_width   Rectangle excess  d2= 1    2    4    8
  13. *     ----------   ----------   ----------------
  14. *  Letter  300        398       98             56   35   25   20
  15. *  Legal   300        510       210            123   71   45   32
  16. *  A4       292        424       132             72   43   29   22
  17. *  B5       252        366       114             47   30   20   16
  18. *
  19. *
  20.     .globl    roto
  21.     .globl    recrot
  22. *
  23. *
  24. *   Entry:
  25. *
  26. *   a0   -> base address of landscape form to rotate
  27. *   a1   -> temp buffer allocated in multiples of (16 * DST form-width)
  28. *   d0.w =  SRC form-width in bytes (must be even)
  29. *   d1.w =  DST form-width in bytes (must be even)
  30. *   d2.w =  # of (16 * DST form-width) multiples that can be used in temp buffer
  31. *
  32. *   Exit:
  33. *
  34. *   all registers preserved, rectangular form is rotated in place
  35. *        90 degrees clockwise with new (DST) form-width
  36. *
  37. recrot:
  38.     movem.l    a0-a6/d0-d7,-(sp)
  39. *
  40. *  Test code
  41.     move.l    a0,lasrbaz
  42.     move.w    d0,lasrwid
  43.     move.w    d1,lasrht
  44. *  End test code
  45. *
  46. testpt0:
  47. *
  48. *  1st rotate largest chunk (a square) in place
  49. *
  50.     move.w    d1,d4        ;do a square rotate 1st
  51.     bsr    roto        ;rotate the biggest chunk in place
  52. *
  53. *  Now rotate-copy d2.w vertical columns of tiles to temp buffer
  54. *
  55.     move.l    a1,a5        ;save temp buf ptr in a5
  56.     lea    (a0,d1.w),a2    ;a2-> SRC top tile of column just rite of square
  57.     lea    -2(a1,d1.w),a3    ;a3-> DST top/rightmost tile of temp buf
  58. schlp:
  59.     move.w    d0,d7        ;d0 = SRC wrap
  60.     lsl.w    #4,d7        ;d7 = SRC tile wrap
  61. *
  62.     move.w    d1,d6        ;d1 = DST wrap
  63.     lsl.w    #4,d6        ;d6 = DST tile wrap
  64. *
  65.     move.l    a2,a4        ;save a2 for later
  66.     move.w    d1,d4        ;DST width
  67.     lsr.w    #1,d4
  68.     subq.w    #1,d4        ;d4 = # of tiles in column (-1)
  69.     subq.w    #1,d2        ;d2 = # of columns (-1)
  70. buflp0:
  71.     movem.l    a2-a3/d2/d4/d6,-(sp)
  72. buflp:
  73.     move.l    a2,a1
  74.     move.l    a3,a6
  75.     bsr    rot2tile
  76.     adda.w    d7,a2
  77.     subq.l    #2,a3    
  78.     dbra    d4,buflp
  79.  
  80.     movem.l    (sp)+,a2-a3/d2/d4/d6
  81.     addq.l    #2,a2
  82.     adda.w    d6,a3
  83.     dbra    d2,buflp0
  84. *
  85.     move.l    8(sp),d2    ;restore buffer size multiple
  86.     add.w    d2,d2        ;  in words
  87. *
  88. *   buffer is full, now scrunch the big form (decrease SRC width by d2*2 bytes)
  89. *
  90.     move.l    a4,a3        ;1st DST column just right of big square
  91.     lea    (a3,d2.w),a2    ;1st SRC column just right of copied columns
  92.     move.w    d1,d4
  93.     lsl.w    #3,d4        ;DST width *8 is # of rows
  94.     move.w    d4,d7
  95.     subq.w    #2,d7
  96. *
  97.     sub.w    d2,d0        ;new SRC width (it's shrinking)
  98.     move.w    d0,d4
  99.     lsr.w    #2,d4        ;get # of long words in SRC row
  100.     bcc.s    elong        ;br if integral # of longwords
  101. *
  102. *   else, do one short word 1st..
  103. *
  104. rwlp0:
  105.     move.w    d4,d5
  106.     move.w    (a2)+,(a3)+
  107.     bra.s    rwlp1i
  108. rwlp1:
  109.     move.l    (a2)+,(a3)+
  110. rwlp1i:
  111.     dbra    d5,rwlp1
  112.     adda.w    d2,a2
  113.     dbra    d7,rwlp0
  114.     bra.s    rwdone
  115. elong:    
  116.     move.w    d4,d5
  117.     bra.s    rwlp2i
  118. rwlp2:
  119.     move.l    (a2)+,(a3)+
  120. rwlp2i:
  121.     dbra    d5,rwlp2
  122.     adda.w    d2,a2
  123.     dbra    d7,elong
  124. rwdone:
  125.     move.w    d0,d7
  126.     sub.w    d1,d7
  127.     lsr.w    #1,d7
  128.     bra    rwlp5i            ;gotta get special case
  129. rwlp5:
  130.     move.w    (a2)+,(a3)+        ;copied for inner column difference
  131. rwlp5i:
  132.     dbra    d7,rwlp5
  133. *
  134. *
  135.     move.w    d1,d6        ;d1 = DST wrap
  136.     lsl.w    #4,d6        ;d6 = DST tile wrap
  137. *
  138. scrnchlp:
  139.     lea    (a0,d0.w),a2    ;a2-> SRC top tile column at far right 
  140.     lea    -2(a3,d1.w),a3    ;a3-> DST rightmost tile of space just freed
  141. *
  142.     move.w    d0,d7        ;d0 = SRC wrap
  143.     lsl.w    #4,d7        ;d7 = tile wrap
  144. *
  145.     sub.w    d2,d0        ;new SRC width (it's shrinking)
  146.     cmp.w    d1,d0        ;did we go too far?
  147.     bpl.s    .10        ;br if ok
  148. *
  149.     move.w    d1,d3
  150.     sub.w    d0,d3        ;d3 = # of word-columns not to do
  151.     sub.w    d3,d2        ;d2 = # of word-columns to do
  152.     add.w    d3,d0
  153.     lsr.w    #1,d3        ;d2 = # of columns not done this trip
  154.     mulu    d6,d3
  155.     add.l    d3,a3        ;adjust DST ptr
  156. .10:
  157.     add.w    d2,d0
  158.     suba.w    d2,a2        ;adjust SRC ptr
  159. *
  160.     move.l    a2,a4        ;save a2 for later
  161.     move.w    d1,d4        ;DST width
  162.     lsr.w    #1,d4
  163.     subq.w    #1,d4        ;d4 = # of tiles in column (-1)
  164.     move.w    d2,-(sp)
  165.     lsr.w    #1,d2
  166.     subq.w    #1,d2        ;d2 = # of columns (-1)
  167. bufloop0:
  168.     movem.l    a2-a3/d2/d4/d6,-(sp)
  169. bufloop:
  170.     move.l    a2,a1
  171.     move.l    a3,a6
  172.     bsr    rot2tile
  173.     adda.w    d7,a2
  174.     subq.l    #2,a3    
  175.     dbra    d4,bufloop
  176. *
  177.     movem.l    (sp)+,a2-a3/d2/d4/d6
  178.     addq.l    #2,a2
  179.     adda.w    d6,a3
  180.     dbra    d2,bufloop0
  181. *
  182.     move.w    (sp)+,d2
  183. *
  184. *   now scrunch the big form (decrease SRC width by d2 bytes)
  185. *
  186.     sub.w    d2,d0
  187.     move.l    a4,a3        ;1st DST to holding buffer
  188.     lea    (a3,d2.w),a2    ;1st SRC column just right of big square
  189.     move.w    d1,d4
  190.     lsl.w    #3,d4        ;DST width *8 is # of rows
  191.     move.w    d4,d7
  192.     subq.w    #2,d7
  193. *
  194.     move.w    d0,d4
  195.     lsr.w    #2,d4        ;get # of long words in SRC row
  196.     bcc.s    evnlong        ;br if integral # of longwords
  197. *
  198. *   else, do one short word 1st..
  199. *
  200. rowlp0:
  201.     move.w    d4,d5
  202.     move.w    (a2)+,(a3)+
  203.     bra.s    rowlp1i
  204. rowlp1:
  205.     move.l    (a2)+,(a3)+
  206. rowlp1i:
  207.     dbra    d5,rowlp1
  208.     adda.w    d2,a2
  209.     dbra    d7,rowlp0
  210.     bra.s    rowdone
  211. evnlong:    
  212.     move.w    d4,d5
  213.     bra.s    rowlp2i
  214. rowlp2:
  215.     move.l    (a2)+,(a3)+
  216. rowlp2i:
  217.     dbra    d5,rowlp2
  218.     adda.w    d2,a2
  219.     dbra    d7,evnlong
  220. rowdone:
  221.     cmp.w    d0,d1            ;have we become DST form-width?
  222.     bne    scrnchlp        ;iterate until we are DST
  223. *
  224. *   Now copy buffer to last freed area
  225. *
  226. *    a3-> DST tile area just freed
  227. *
  228.     move.l    a5,a2        ;get buffer copied back in
  229. *
  230.     lsl.w    #3,d0        ;DST wrap *8 is # of words in buffer
  231.     mulu    8+2(sp),d0
  232.     bra.s    bufini
  233. bufinlp:
  234.     move.w    (a2)+,(a3)+
  235. bufini:
  236.     dbra    d0,bufinlp
  237. *
  238. *   test code
  239.     move.w    lasrwid,d1
  240.     move.w    lasrht,d2
  241.     move.w    d2,lasrwid
  242.     move.w    d1,lasrht
  243. *
  244. *   end test
  245. *
  246. testpt1:
  247.     movem.l    (sp)+,a0-a6/d0-d7
  248.     rts
  249. *
  250. *   Rotate 90 degrees clockwise a large square page-size form in place
  251. *
  252. *   Programmer: Dave Staugas
  253. *         Date: 5-June-89
  254. *
  255. *   Entry:
  256. *
  257. *   a0   -> base address of square form to rotate
  258. *   d0.w =  form-width in bytes (must be even)
  259. *   d4.w =  # of bytes on a side of the square (also must be even)
  260. *
  261. *   Exit:
  262. *
  263. *  all regs preserved, square form is rotated in place 90 degrees clockwise
  264. *
  265. roto:
  266.     movem.l    a0-a6/d0-d7,-(sp)
  267.     move.w    d0,d7        ;copy form-width to d7
  268.     lsl.w    #4,d7        ;x16 for offset in form for 1 tile down
  269. *
  270.     lsr.w    #1,d4        ;d4 = # tiles on a side
  271. *
  272. *   a2 -> top/left tile address
  273. *
  274. *   d0 = form-wrap
  275. *   d4 = # of tiles on a side
  276. *   d7 = offset in form for 1 tile down
  277. *
  278. rotlp0:
  279.     move.l    a0,a2        ;a2 -> top/left tile
  280.     move.w    d4,d3
  281.     subq.w    #1,d3
  282.     mulu    d7,d3
  283.     lea    (a2,d3.l),a4    ;a4 -> bot/left tile
  284.     add.w    d4,d4
  285.     lea    -2(a2,d4.w),a3    ;a3 -> top/right tile
  286.     lea    -2(a4,d4.w),a5    ;a5 -> bot/right tile
  287.     lsr.w    #1,d4
  288. rotlp1:
  289.     move.l    a2,a1        ;top/left is SRC
  290.     moveq    #2,d1        ;DST form wrap (just 16 byte buffer)
  291.     lea    tilebuf,a6
  292.     bsr    rot2tile    ;rotate top/left to buffer
  293. *
  294.     move.l    a4,a1        ;bot/left is SRC
  295.     move.w    d0,d1        ;DST form wrap is same as SRC
  296.     move.l    a2,a6        ;top/left is DST
  297.     bsr    rot2tile    ;rotate bot/left to top/left tile
  298. *    
  299.     move.l    a5,a1        ;bot/right is SRC
  300.     move.l    a4,a6        ;bot/left is DST
  301.     bsr    rot2tile    ;rotate bot/right to bot/left tile
  302. *
  303.     move.l    a3,a1        ;top/right is SRC
  304.     move.l    a5,a6        ;bot/right is DST
  305.     bsr    rot2tile    ;rotate top/right to bot/right
  306. *
  307.     lea    tilebuf,a1
  308.     move.l    a3,a6
  309.     moveq    #15,d5
  310. coploop:
  311.     move.w    (a1)+,(a6)
  312.     adda.w    d0,a6
  313.     dbra    d5,coploop    ;copy rotated tile buffer to top/left
  314. *
  315.     adda.w    d7,a2        ;move top/left down 1 tile
  316.     suba.w    d7,a5        ;move bot/right up 1 tile
  317.     addq.l    #2,a4        ;move bot/left right 1 tile
  318.     subq.l    #2,a3        ;move top/right left 1 tile
  319.     cmp.l    a0,a3        ;does top/right equal base?
  320.     bne    rotlp1        ;iterate until it does
  321. *
  322.     lea    2(a0,d7.w),a0    ;now put base down 1 tile & left 1 tile
  323.     subq.l    #2,d4        ;next # of tiles on a side
  324.     beq.s    rotdone        ;br if none left
  325.     cmpi.w    #1,d4        ;check for odd case
  326.     bne    rotlp0
  327. *
  328.     move.l    a0,a1
  329.     move.l    a0,a6
  330.     bsr    rot2tile
  331. *
  332. rotdone:
  333.     movem.l    (sp)+,a0-a6/d0-d7
  334.     rts
  335. *
  336. *
  337. *
  338. *
  339. *    
  340. ******************************************
  341. *
  342. *   Rotate a 16x16 pixel tile clockwise 90 degrees and copy to another tile
  343. *
  344. *
  345. *   d0 = SRC form-wrap
  346. *   d1 = DST form-wrap
  347. *
  348. *   a1 -> top/left of SRC tile
  349. *   a6 -> top/left of DST tile
  350. *  
  351. rot2tile:
  352.     movem.l    a0/a2-a5/d0-d1/d4/d7,-(sp)
  353. *
  354. *  pack 16 words of tile into 4 data & 4 address registers..
  355. *
  356.     move.w    (a1),d2
  357.     adda.w    d0,a1
  358.     move.w    (a1),d3
  359.     adda.w    d0,a1
  360.     move.w    (a1),d4
  361.     adda.w    d0,a1
  362.     move.w    (a1),d5
  363.     adda.w    d0,a1
  364. *
  365.     swap    d2
  366.     swap    d3
  367.     swap    d4
  368.     swap    d5
  369. *
  370.     move.w    (a1),d2
  371.     adda.w    d0,a1
  372.     move.w    (a1),d3
  373.     adda.w    d0,a1
  374.     move.w    (a1),d4
  375.     adda.w    d0,a1
  376.     move.w    (a1),d5
  377.     adda.w    d0,a1
  378. *
  379.     exg    d2,a2
  380.     exg    d3,a3
  381.     exg    d4,a4
  382.     exg    d5,a5
  383. *
  384.     move.w    (a1),d2
  385.     adda.w    d0,a1
  386.     move.w    (a1),d3
  387.     adda.w    d0,a1
  388.     move.w    (a1),d4
  389.     adda.w    d0,a1
  390.     move.w    (a1),d5
  391.     adda.w    d0,a1
  392. *
  393.     swap    d2
  394.     swap    d3
  395.     swap    d4
  396.     swap    d5
  397. *
  398.     move.w    (a1),d2
  399.     adda.w    d0,a1
  400.     move.w    (a1),d3
  401.     adda.w    d0,a1
  402.     move.w    (a1),d4
  403.     adda.w    d0,a1
  404.     move.w    (a1),d5
  405. *
  406. *   Got all 16 words of tile in registers, now rotate..
  407. *
  408.     moveq    #3,d0        ;iterate 4 times
  409. rotlp2:
  410.     swap    d1        ;DST form-width to high word
  411.     swap    d0        ;get d0.w ready to receive bits
  412.     add.w    d5,d5
  413.     addx.w    d1,d1
  414.     add.w    d5,d5
  415.     addx.w    d0,d0
  416.     add.w    d5,d5
  417.     addx.w    d6,d6
  418.     add.w    d5,d5
  419.     addx.w    d7,d7
  420.  
  421.     add.w    d4,d4
  422.     addx.w    d1,d1
  423.     add.w    d4,d4
  424.     addx.w    d0,d0
  425.     add.w    d4,d4
  426.     addx.w    d6,d6
  427.     add.w    d4,d4
  428.     addx.w    d7,d7
  429.  
  430.     add.w    d3,d3
  431.     addx.w    d1,d1
  432.     add.w    d3,d3
  433.     addx.w    d0,d0
  434.     add.w    d3,d3
  435.     addx.w    d6,d6
  436.     add.w    d3,d3
  437.     addx.w    d7,d7
  438.  
  439.     add.w    d2,d2
  440.     addx.w    d1,d1
  441.     add.w    d2,d2
  442.     addx.w    d0,d0
  443.     add.w    d2,d2
  444.     addx.w    d6,d6
  445.     add.w    d2,d2
  446.     addx.w    d7,d7
  447. *
  448.     swap    d2
  449.     swap    d3
  450.     swap    d4
  451.     swap    d5
  452. *
  453.     add.w    d5,d5
  454.     addx.w    d1,d1
  455.     add.w    d5,d5
  456.     addx.w    d0,d0
  457.     add.w    d5,d5
  458.     addx.w    d6,d6
  459.     add.w    d5,d5
  460.     addx.w    d7,d7
  461.  
  462.     add.w    d4,d4
  463.     addx.w    d1,d1
  464.     add.w    d4,d4
  465.     addx.w    d0,d0
  466.     add.w    d4,d4
  467.     addx.w    d6,d6
  468.     add.w    d4,d4
  469.     addx.w    d7,d7
  470.  
  471.     add.w    d3,d3
  472.     addx.w    d1,d1
  473.     add.w    d3,d3
  474.     addx.w    d0,d0
  475.     add.w    d3,d3
  476.     addx.w    d6,d6
  477.     add.w    d3,d3
  478.     addx.w    d7,d7
  479.  
  480.     add.w    d2,d2
  481.     addx.w    d1,d1
  482.     add.w    d2,d2
  483.     addx.w    d0,d0
  484.     add.w    d2,d2
  485.     addx.w    d6,d6
  486.     add.w    d2,d2
  487.     addx.w    d7,d7
  488. *
  489.     swap    d2
  490.     swap    d3
  491.     swap    d4
  492.     swap    d5
  493. *
  494.     exg    d2,a2
  495.     exg    d3,a3
  496.     exg    d4,a4
  497.     exg    d5,a5
  498. *
  499. *
  500.     add.w    d5,d5
  501.     addx.w    d1,d1
  502.     add.w    d5,d5
  503.     addx.w    d0,d0
  504.     add.w    d5,d5
  505.     addx.w    d6,d6
  506.     add.w    d5,d5
  507.     addx.w    d7,d7
  508.  
  509.     add.w    d4,d4
  510.     addx.w    d1,d1
  511.     add.w    d4,d4
  512.     addx.w    d0,d0
  513.     add.w    d4,d4
  514.     addx.w    d6,d6
  515.     add.w    d4,d4
  516.     addx.w    d7,d7
  517.  
  518.     add.w    d3,d3
  519.     addx.w    d1,d1
  520.     add.w    d3,d3
  521.     addx.w    d0,d0
  522.     add.w    d3,d3
  523.     addx.w    d6,d6
  524.     add.w    d3,d3
  525.     addx.w    d7,d7
  526.  
  527.     add.w    d2,d2
  528.     addx.w    d1,d1
  529.     add.w    d2,d2
  530.     addx.w    d0,d0
  531.     add.w    d2,d2
  532.     addx.w    d6,d6
  533.     add.w    d2,d2
  534.     addx.w    d7,d7
  535. *
  536. *
  537.     swap    d2
  538.     swap    d3
  539.     swap    d4
  540.     swap    d5
  541. *
  542.  
  543.     add.w    d5,d5
  544.     addx.w    d1,d1
  545.     add.w    d5,d5
  546.     addx.w    d0,d0
  547.     add.w    d5,d5
  548.     addx.w    d6,d6
  549.     add.w    d5,d5
  550.     addx.w    d7,d7
  551.  
  552.     add.w    d4,d4
  553.     addx.w    d1,d1
  554.     add.w    d4,d4
  555.     addx.w    d0,d0
  556.     add.w    d4,d4
  557.     addx.w    d6,d6
  558.     add.w    d4,d4
  559.     addx.w    d7,d7
  560.  
  561.     add.w    d3,d3
  562.     addx.w    d1,d1
  563.     add.w    d3,d3
  564.     addx.w    d0,d0
  565.     add.w    d3,d3
  566.     addx.w    d6,d6
  567.     add.w    d3,d3
  568.     addx.w    d7,d7
  569.  
  570.     add.w    d2,d2
  571.     addx.w    d1,d1
  572.     add.w    d2,d2
  573.     addx.w    d0,d0
  574.     add.w    d2,d2
  575.     addx.w    d6,d6
  576.     add.w    d2,d2
  577.     addx.w    d7,d7
  578. *
  579.     swap    d2
  580.     swap    d3
  581.     swap    d4
  582.     swap    d5
  583. *
  584.     exg    d2,a2
  585.     exg    d3,a3
  586.     exg    d4,a4
  587.     exg    d5,a5
  588. *
  589.     move.w    d1,(a6)
  590.     swap    d1        ;get DST form-width
  591.     adda.w    d1,a6
  592.     move.w    d0,(a6)
  593.     swap    d0        ;get loop count
  594.     adda.w    d1,a6
  595.     move.w    d6,(a6)
  596.     adda.w    d1,a6
  597.     move.w    d7,(a6)
  598.     adda.w    d1,a6
  599. *
  600.     dbra    d0,rotlp2    ;do all 16
  601. *
  602.     movem.l    (sp)+,a0/a2-a5/d0-d1/d4/d7
  603.     rts
  604. *
  605. *
  606. *
  607. *
  608. *  test code
  609. *
  610. view:
  611.     movem.l    a0-a6/d0-d7,-(sp)
  612.     moveq    #0,d1            ;horz
  613.     moveq    #0,d2            ;vert
  614. view0:
  615.     move.l    lasrbaz,a0
  616.     move.w    d2,d0
  617.     mulu    lasrwid,d0
  618.     add.l    d0,a0
  619.     add.l    d1,a0
  620.     lea    $c00000,a1
  621.     move.w    lasrwid,d0
  622.     sub.w    #160,d0
  623.  
  624.     move.w    lasrht,d4
  625.     lsl.w    #3,d4
  626.     move.w    #960,d5
  627.     add.w    d2,d5
  628.     cmp.w    d5,d4
  629.     bcc.s    doview
  630.     sub.w    d4,d5
  631.     move.w    #960,d4
  632.     sub.w    d5,d4
  633.     bra.s    view1i
  634. doview:
  635.     move.w    #960,d4
  636.     moveq    #0,d5
  637.     bra.s    view1i
  638. view1:
  639.     move.w    #79,d3
  640. view2:
  641.     move.w    (a0)+,(a1)+
  642.     dbra    d3,view2
  643.     adda.w    d0,a0
  644. view1i:
  645.     dbra    d4,view1
  646. *
  647.     subq.w    #1,d5
  648.     bmi.s    viewdon
  649.     move.w    #79,d3
  650. view3:
  651.     move.w    #-1,(a1)+
  652.     dbra    d3,view3
  653.     bra.s    view4i
  654. view4:
  655.     move.w    #79,d3
  656. view5:
  657.     clr.w    (a1)+
  658.     dbra    d3,view5
  659. view4i:
  660.     dbra    d5,view4
  661. viewdon:
  662. *
  663.     movem.l    d1-d2,-(sp)
  664.     move.w    #2,-(sp)    
  665.     move.w    #2,-(sp)    
  666.     trap    #13
  667.     addq.l    #4,sp
  668.     movem.l    (sp)+,d1-d2
  669.     tst.w    d0
  670.     bne.s    exit
  671.     swap    d0
  672.     cmpi.b    #$4d,d0        ;rite
  673.     bne.s    .10
  674.     add.w    #80,d1
  675.     bra    view0
  676. .10:
  677.     cmpi.b    #$4b,d0        ;left
  678.     bne.s    .20
  679.     sub.w    #80,d1
  680.     bpl    view0
  681.     moveq    #0,d1
  682.     bra    view0
  683. .20:
  684.     cmpi.b    #$50,d0        ;down
  685.     bne.s    .30
  686.     add.w    #480,d2
  687.     bra    view0
  688. .30:
  689.     cmpi.b    #$48,d0        ;up
  690.     bne.s    exit
  691.     sub.w    #480,d2
  692.     bpl    view0
  693.     moveq    #0,d2
  694.     bra    view0
  695. *
  696. exit:
  697.     movem.l    (sp)+,a0-a6/d0-d7
  698.     rts
  699. *
  700. lasrbaz:
  701.     .dc.l    $c00000
  702. lasrwid:
  703.     .dc.w    160
  704. lasrht:
  705.     .dc.w    50
  706. *
  707. *
  708.     .bss
  709. tilebuf:
  710.     .ds.w    16
  711.